home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / mus / midi / NoteOn.lha / NoteOn / NoteOn.c < prev    next >
C/C++ Source or Header  |  1995-01-30  |  15KB  |  827 lines

  1. #ifndef MAKE_ID
  2. #define MAKE_ID(a,b,c,d) ((ULONG) (a)<<24 | (ULONG) (b)<<16 | (ULONG) (c)<<8 | (ULONG) (d))
  3. #endif
  4.  
  5. #ifdef _DCC
  6. #define __inline
  7. #endif
  8.  
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <ctype.h>
  12. #include <string.h>
  13. #include <midi/midi.h>
  14. #include <sys/types.h>
  15. #include <utility/hooks.h>
  16. #include <libraries/mui.h>
  17. #include <proto/muimaster.h>
  18. #include <clib/exec_protos.h>
  19. #include <exec/memory.h>
  20. #include <clib/alib_protos.h>
  21.  
  22. #define HOOK __saveds __asm
  23. #define A0(stuff) register __a0 stuff
  24. #define A1(stuff) register __a1 stuff
  25. #define A2(stuff) register __a2 stuff
  26.  
  27. struct ObjApp
  28. {
  29.     APTR    App;
  30.     APTR    WI_Principale;
  31.     APTR    BT_2;
  32.     APTR    BT_3;
  33.     APTR    BT_5;
  34.     APTR    BT_6;
  35.     APTR    BT_7;
  36.     APTR    BT_A;
  37.     APTR    BT_Z;
  38.     APTR    BT_E;
  39.     APTR    BT_R;
  40.     APTR    BT_T;
  41.     APTR    BT_Y;
  42.     APTR    BT_U;
  43.     APTR    BT_I;
  44.     APTR    BT_S;
  45.     APTR    BT_D;
  46.     APTR    BT_G;
  47.     APTR    BT_H;
  48.     APTR    BT_J;
  49.     APTR    BT_W;
  50.     APTR    BT_X;
  51.     APTR    BT_C;
  52.     APTR    BT_V;
  53.     APTR    BT_B;
  54.     APTR    BT_N;
  55.     APTR    BT_Virgule;
  56.     APTR    BT_PointVirg;
  57.     APTR    SL_velocity;
  58.     APTR    SL_MidiChannel;
  59. };
  60.  
  61. UBYTE Velocity=63;
  62. UBYTE MidiChannel=1;
  63.  
  64. struct MRoute *RouteOut;
  65. struct MSource *source;
  66. struct ObjApp * App;
  67. struct Library        *MidiBase    = NULL;
  68. struct Library        *MUIMasterBase    = NULL;
  69.  
  70.  
  71. ULONG HOOK NoteOn(A0(struct Hook *hook),A2(APTR object),A1(LONG* notenumber))
  72. {
  73.     UBYTE buf[3];
  74.     int len=3;
  75.  
  76.  
  77.         buf[0]=    0x90 + ((MidiChannel-1) & 0x0f);
  78.         buf[1]=    (UBYTE)(*notenumber);
  79.         buf[2]=    Velocity;
  80.         
  81.         PutMidiStream(source,NULL,buf,len,len);        
  82.  
  83.     return 0;
  84. }
  85.  
  86.  
  87. ULONG HOOK NoteOff(A0(struct Hook *hook),A2(APTR object),A1(LONG* notenumber))
  88. {
  89.     UBYTE buf[3];
  90.     int len=3;
  91.  
  92.         buf[0]=    0x80 + ((MidiChannel-1) & 0x0f);
  93.         buf[1]=    (UBYTE)(*notenumber);
  94.         buf[2]=    0x3f;
  95.         
  96.         PutMidiStream(source,NULL,buf,len,len);        
  97.  
  98.     return 0;
  99. }
  100.  
  101. ULONG HOOK VelocityChange(A0(struct Hook *hook),A2(APTR object),A1(APTR message))
  102. {
  103.     LONG i;
  104.     ULONG *address=message;
  105.     struct ObjApp *obj=(struct ObjApp *)*address;
  106.  
  107.     get(obj->SL_velocity,MUIA_Slider_Level,&i);
  108.     Velocity = (UBYTE)i;
  109.     return 0;
  110. }
  111.  
  112. ULONG HOOK MidiChannelChange(A0(struct Hook *hook),A2(APTR object),A1(APTR message))
  113. {
  114.     LONG i;
  115.     ULONG *address=message;
  116.     struct ObjApp *obj=(struct ObjApp *)*address;
  117.  
  118.     get(obj->SL_MidiChannel,MUIA_Slider_Level,&i);
  119.     MidiChannel = (UBYTE)i;
  120.     return 0;
  121. }
  122.  
  123. struct ObjApp * CreateApp(void)
  124. {
  125.     struct ObjApp * Object;
  126.  
  127.     APTR    GROUP_ROOT_0, GR_alt_aigu, Space_0, Space_1, Space_2, Space_3, Space_4;
  128.     APTR    Space_5, GR_nat_aigu, Space_7, GR_alt_grave, Space_8, Space_9, Space_10;
  129.     APTR    Space_11, Space_12, Space_13, GR_nat_grave, Space_14, obj_aux0, obj_aux1;
  130.     APTR    obj_aux2, obj_aux3;
  131.     static const struct Hook NoteOnHook = { { NULL,NULL },(VOID *)NoteOn,NULL,NULL };
  132.     static const struct Hook NoteOffHook = { { NULL,NULL },(VOID *)NoteOff,NULL,NULL };
  133.     static const struct Hook VelocityChangeHook = { { NULL,NULL },(VOID *)VelocityChange,NULL,NULL };
  134.     static const struct Hook MidiChannelChangeHook = { { NULL,NULL },(VOID *)MidiChannelChange,NULL,NULL };
  135.  
  136.  
  137.     if (!(Object = AllocVec(sizeof(struct ObjApp), MEMF_PUBLIC|MEMF_CLEAR)))
  138.         return(NULL);
  139.  
  140.     Space_0 = HSpace(0);
  141.  
  142.     Object->BT_2 = SimpleButton("_é C#4");
  143.  
  144.     Object->BT_3 = SimpleButton("_\" D#4");
  145.  
  146.     Space_1 = HSpace(0);
  147.  
  148.     Space_2 = HSpace(0);
  149.  
  150.     Object->BT_5 = SimpleButton("_( F#4");
  151.  
  152.     Object->BT_6 = SimpleButton("_§ G#4");
  153.  
  154.     Object->BT_7 = SimpleButton("_è A#4");
  155.  
  156.     Space_3 = HSpace(0);
  157.  
  158.     Space_4 = HSpace(0);
  159.  
  160.     Space_5 = HSpace(0);
  161.  
  162.     GR_alt_aigu = GroupObject,
  163.         MUIA_HelpNode, "GR_alt_aigu",
  164.         MUIA_Group_Horiz, TRUE,
  165.         Child, Space_0,
  166.         Child, Object->BT_2,
  167.         Child, Object->BT_3,
  168.         Child, Space_1,
  169.         Child, Space_2,
  170.         Child, Object->BT_5,
  171.         Child, Object->BT_6,
  172.         Child, Object->BT_7,
  173.         Child, Space_3,
  174.         Child, Space_4,
  175.         Child, Space_5,
  176.     End;
  177.  
  178.     Object->BT_A = SimpleButton("_A C4");
  179.  
  180.     Object->BT_Z = SimpleButton("_Z D4");
  181.  
  182.     Object->BT_E = SimpleButton("_E E4");
  183.  
  184.     Object->BT_R = SimpleButton("_R F4");
  185.  
  186.     Object->BT_T = SimpleButton("_T G4");
  187.  
  188.     Object->BT_Y = SimpleButton("_Y A4");
  189.  
  190.     Object->BT_U = SimpleButton("_U B4");
  191.  
  192.     Object->BT_I = SimpleButton("_I C5");
  193.  
  194.     GR_nat_aigu = GroupObject,
  195.         MUIA_HelpNode, "GR_nat_aigu",
  196.         MUIA_Group_Horiz, TRUE,
  197.         Child, Object->BT_A,
  198.         Child, Object->BT_Z,
  199.         Child, Object->BT_E,
  200.         Child, Object->BT_R,
  201.         Child, Object->BT_T,
  202.         Child, Object->BT_Y,
  203.         Child, Object->BT_U,
  204.         Child, Object->BT_I,
  205.     End;
  206.  
  207.     Space_7 = VSpace(20);
  208.  
  209.     Space_8 = HSpace(0);
  210.  
  211.     Object->BT_S = SimpleButton("_S C#3");
  212.  
  213.     Object->BT_D = SimpleButton("_D D#3");
  214.  
  215.     Space_9 = HSpace(0);
  216.  
  217.     Space_10 = HSpace(0);
  218.  
  219.     Object->BT_G = SimpleButton("_G F#3");
  220.  
  221.     Object->BT_H = SimpleButton("_H G#3");
  222.  
  223.     Object->BT_J = SimpleButton("_J A#3");
  224.  
  225.     Space_11 = HSpace(0);
  226.  
  227.     Space_12 = HSpace(0);
  228.  
  229.     Space_13 = HSpace(0);
  230.  
  231.     GR_alt_grave = GroupObject,
  232.         MUIA_HelpNode, "GR_alt_grave",
  233.         MUIA_Group_Horiz, TRUE,
  234.         Child, Space_8,
  235.         Child, Object->BT_S,
  236.         Child, Object->BT_D,
  237.         Child, Space_9,
  238.         Child, Space_10,
  239.         Child, Object->BT_G,
  240.         Child, Object->BT_H,
  241.         Child, Object->BT_J,
  242.         Child, Space_11,
  243.         Child, Space_12,
  244.         Child, Space_13,
  245.     End;
  246.  
  247.     Object->BT_W = SimpleButton("_W C3");
  248.  
  249.     Object->BT_X = SimpleButton("_X D3");
  250.  
  251.     Object->BT_C = SimpleButton("_C E3");
  252.  
  253.     Object->BT_V = SimpleButton("_V F3");
  254.  
  255.     Object->BT_B = SimpleButton("_B G3");
  256.  
  257.     Object->BT_N = SimpleButton("_N A3");
  258.  
  259.     Object->BT_Virgule = SimpleButton("_, B3");
  260.  
  261.     Object->BT_PointVirg = SimpleButton("_; C4");
  262.  
  263.     GR_nat_grave = GroupObject,
  264.         MUIA_HelpNode, "GR_nat_grave",
  265.         MUIA_Group_Horiz, TRUE,
  266.         Child, Object->BT_W,
  267.         Child, Object->BT_X,
  268.         Child, Object->BT_C,
  269.         Child, Object->BT_V,
  270.         Child, Object->BT_B,
  271.         Child, Object->BT_N,
  272.         Child, Object->BT_Virgule,
  273.         Child, Object->BT_PointVirg,
  274.     End;
  275.  
  276.     Space_14 = VSpace(20);
  277.  
  278.     Object->SL_velocity = SliderObject,
  279.         MUIA_HelpNode, "SL_velocity",
  280.         MUIA_Slider_Min, 0,
  281.         MUIA_Slider_Max, 127,
  282.         MUIA_Slider_Level, 63,
  283.     End;
  284.  
  285.     obj_aux1 = Label2("Velocity");
  286.  
  287.     obj_aux0 = GroupObject,
  288.         MUIA_Group_Columns, 2,
  289.         Child, obj_aux1,
  290.         Child, Object->SL_velocity,
  291.     End;
  292.  
  293.     Object->SL_MidiChannel = SliderObject,
  294.         MUIA_HelpNode, "SL_MidiChannel",
  295.         MUIA_Slider_Min, 1,
  296.         MUIA_Slider_Max, 16,
  297.         MUIA_Slider_Level, 1,
  298.     End;
  299.  
  300.     obj_aux3 = Label2("Midi Channel");
  301.  
  302.     obj_aux2 = GroupObject,
  303.         MUIA_Group_Columns, 2,
  304.         Child, obj_aux3,
  305.         Child, Object->SL_MidiChannel,
  306.     End;
  307.  
  308.     GROUP_ROOT_0 = GroupObject,
  309.         Child, GR_alt_aigu,
  310.         Child, GR_nat_aigu,
  311.         Child, Space_7,
  312.         Child, GR_alt_grave,
  313.         Child, GR_nat_grave,
  314.         Child, Space_14,
  315.         Child, obj_aux0,
  316.         Child, obj_aux2,
  317.     End;
  318.  
  319.     Object->WI_Principale = WindowObject,
  320.         MUIA_Window_Title, "NoteOn",
  321.         MUIA_Window_ID, MAKE_ID('0', 'W', 'I', 'N'),
  322.         WindowContents, GROUP_ROOT_0,
  323.     End;
  324.  
  325.     Object->App = ApplicationObject,
  326.         MUIA_Application_Author, "Stanis Humez",
  327.         MUIA_Application_Base, "NOTEON",
  328.         MUIA_Application_Title, "NoteOn",
  329.         MUIA_Application_Version, "$VER: NoteOn 1.00 (30.01.1995)",
  330.         MUIA_Application_Copyright, "© 1995 Stanis Humez",
  331.         MUIA_Application_Description, "Midi Keyboard",
  332.         SubWindow, Object->WI_Principale,
  333.     End;
  334.  
  335.  
  336.     if (!Object->App)
  337.     {
  338.         FreeVec(Object);
  339.         return(NULL);
  340.     }
  341.  
  342.     DoMethod(Object->WI_Principale,
  343.         MUIM_Notify, MUIA_Window_CloseRequest, TRUE,
  344.         Object->App,
  345.         2,
  346.         MUIM_Application_ReturnID, MUIV_Application_ReturnID_Quit
  347.         );
  348.  
  349.     DoMethod(Object->BT_2,
  350.         MUIM_Notify, MUIA_Pressed, TRUE,
  351.         Object->App,
  352.         3,
  353.         MUIM_CallHook, &NoteOnHook,61
  354.         );
  355.  
  356.     DoMethod(Object->BT_2,
  357.         MUIM_Notify, MUIA_Pressed, FALSE,
  358.         Object->App,
  359.         3,
  360.         MUIM_CallHook, &NoteOffHook,61
  361.         );
  362.  
  363.     DoMethod(Object->BT_3,
  364.         MUIM_Notify, MUIA_Pressed, TRUE,
  365.         Object->App,
  366.         3,
  367.         MUIM_CallHook, &NoteOnHook,63
  368.         );
  369.  
  370.     DoMethod(Object->BT_3,
  371.         MUIM_Notify, MUIA_Pressed, FALSE,
  372.         Object->App,
  373.         3,
  374.         MUIM_CallHook, &NoteOffHook,63
  375.         );
  376.  
  377.     DoMethod(Object->BT_5,
  378.         MUIM_Notify, MUIA_Pressed, TRUE,
  379.         Object->App,
  380.         3,
  381.         MUIM_CallHook, &NoteOnHook,66
  382.         );
  383.  
  384.     DoMethod(Object->BT_5,
  385.         MUIM_Notify, MUIA_Pressed, FALSE,
  386.         Object->App,
  387.         3,
  388.         MUIM_CallHook, &NoteOffHook,66
  389.         );
  390.  
  391.     DoMethod(Object->BT_6,
  392.         MUIM_Notify, MUIA_Pressed, TRUE,
  393.         Object->App,
  394.         3,
  395.         MUIM_CallHook, &NoteOnHook,68
  396.         );
  397.  
  398.     DoMethod(Object->BT_6,
  399.         MUIM_Notify, MUIA_Pressed, FALSE,
  400.         Object->App,
  401.         3,
  402.         MUIM_CallHook, &NoteOffHook,68
  403.         );
  404.  
  405.     DoMethod(Object->BT_7,
  406.         MUIM_Notify, MUIA_Pressed, TRUE,
  407.         Object->App,
  408.         3,
  409.         MUIM_CallHook, &NoteOnHook,70
  410.         );
  411.  
  412.     DoMethod(Object->BT_7,
  413.         MUIM_Notify, MUIA_Pressed, FALSE,
  414.         Object->App,
  415.         3,
  416.         MUIM_CallHook, &NoteOffHook,70
  417.         );
  418.  
  419.     DoMethod(Object->BT_A,
  420.         MUIM_Notify, MUIA_Pressed, TRUE,
  421.         Object->App,
  422.         3,
  423.         MUIM_CallHook, &NoteOnHook,60
  424.         );
  425.  
  426.     DoMethod(Object->BT_A,
  427.         MUIM_Notify, MUIA_Pressed, FALSE,
  428.         Object->App,
  429.         3,
  430.         MUIM_CallHook, &NoteOffHook,60
  431.         );
  432.  
  433.     DoMethod(Object->BT_Z,
  434.         MUIM_Notify, MUIA_Pressed, TRUE,
  435.         Object->App,
  436.         3,
  437.         MUIM_CallHook, &NoteOnHook,62
  438.         );
  439.  
  440.     DoMethod(Object->BT_Z,
  441.         MUIM_Notify, MUIA_Pressed, FALSE,
  442.         Object->App,
  443.         3,
  444.         MUIM_CallHook, &NoteOffHook,62
  445.         );
  446.  
  447.     DoMethod(Object->BT_E,
  448.         MUIM_Notify, MUIA_Pressed, TRUE,
  449.         Object->App,
  450.         3,
  451.         MUIM_CallHook, &NoteOnHook,64
  452.         );
  453.  
  454.     DoMethod(Object->BT_E,
  455.         MUIM_Notify, MUIA_Pressed, FALSE,
  456.         Object->App,
  457.         3,
  458.         MUIM_CallHook, &NoteOffHook,64
  459.         );
  460.  
  461.     DoMethod(Object->BT_R,
  462.         MUIM_Notify, MUIA_Pressed, TRUE,
  463.         Object->App,
  464.         3,
  465.         MUIM_CallHook, &NoteOnHook,65
  466.         );
  467.  
  468.     DoMethod(Object->BT_R,
  469.         MUIM_Notify, MUIA_Pressed, FALSE,
  470.         Object->App,
  471.         3,
  472.         MUIM_CallHook, &NoteOffHook,65
  473.         );
  474.  
  475.     DoMethod(Object->BT_T,
  476.         MUIM_Notify, MUIA_Pressed, TRUE,
  477.         Object->App,
  478.         3,
  479.         MUIM_CallHook, &NoteOnHook,67
  480.         );
  481.  
  482.     DoMethod(Object->BT_T,
  483.         MUIM_Notify, MUIA_Pressed, FALSE,
  484.         Object->App,
  485.         3,
  486.         MUIM_CallHook, &NoteOffHook,67
  487.         );
  488.  
  489.     DoMethod(Object->BT_Y,
  490.         MUIM_Notify, MUIA_Pressed, TRUE,
  491.         Object->App,
  492.         3,
  493.         MUIM_CallHook, &NoteOnHook,69
  494.         );
  495.  
  496.     DoMethod(Object->BT_Y,
  497.         MUIM_Notify, MUIA_Pressed, FALSE,
  498.         Object->App,
  499.         3,
  500.         MUIM_CallHook, &NoteOffHook,69
  501.         );
  502.  
  503.     DoMethod(Object->BT_U,
  504.         MUIM_Notify, MUIA_Pressed, TRUE,
  505.         Object->App,
  506.         3,
  507.         MUIM_CallHook, &NoteOnHook,71
  508.         );
  509.  
  510.     DoMethod(Object->BT_U,
  511.         MUIM_Notify, MUIA_Pressed, FALSE,
  512.         Object->App,
  513.         3,
  514.         MUIM_CallHook, &NoteOffHook,71
  515.         );
  516.  
  517.     DoMethod(Object->BT_I,
  518.         MUIM_Notify, MUIA_Pressed, TRUE,
  519.         Object->App,
  520.         3,
  521.         MUIM_CallHook, &NoteOnHook,72
  522.         );
  523.  
  524.     DoMethod(Object->BT_I,
  525.         MUIM_Notify, MUIA_Pressed, FALSE,
  526.         Object->App,
  527.         3,
  528.         MUIM_CallHook, &NoteOffHook,72
  529.         );
  530.  
  531.     DoMethod(Object->BT_S,
  532.         MUIM_Notify, MUIA_Pressed, TRUE,
  533.         Object->App,
  534.         3,
  535.         MUIM_CallHook, &NoteOnHook,49
  536.         );
  537.  
  538.     DoMethod(Object->BT_S,
  539.         MUIM_Notify, MUIA_Pressed, FALSE,
  540.         Object->App,
  541.         3,
  542.         MUIM_CallHook, &NoteOffHook,49
  543.         );
  544.  
  545.     DoMethod(Object->BT_D,
  546.         MUIM_Notify, MUIA_Pressed, TRUE,
  547.         Object->App,
  548.         3,
  549.         MUIM_CallHook, &NoteOnHook,51
  550.         );
  551.  
  552.     DoMethod(Object->BT_D,
  553.         MUIM_Notify, MUIA_Pressed, FALSE,
  554.         Object->App,
  555.         3,
  556.         MUIM_CallHook, &NoteOffHook,51
  557.         );
  558.  
  559.     DoMethod(Object->BT_G,
  560.         MUIM_Notify, MUIA_Pressed, TRUE,
  561.         Object->App,
  562.         3,
  563.         MUIM_CallHook, &NoteOnHook,54
  564.         );
  565.  
  566.     DoMethod(Object->BT_G,
  567.         MUIM_Notify, MUIA_Pressed, FALSE,
  568.         Object->App,
  569.         3,
  570.         MUIM_CallHook, &NoteOffHook,54
  571.         );
  572.  
  573.     DoMethod(Object->BT_H,
  574.         MUIM_Notify, MUIA_Pressed, TRUE,
  575.         Object->App,
  576.         3,
  577.         MUIM_CallHook, &NoteOnHook,56
  578.         );
  579.  
  580.     DoMethod(Object->BT_H,
  581.         MUIM_Notify, MUIA_Pressed, FALSE,
  582.         Object->App,
  583.         3,
  584.         MUIM_CallHook, &NoteOffHook,56
  585.         );
  586.  
  587.     DoMethod(Object->BT_J,
  588.         MUIM_Notify, MUIA_Pressed, TRUE,
  589.         Object->App,
  590.         3,
  591.         MUIM_CallHook, &NoteOnHook,58
  592.         );
  593.  
  594.     DoMethod(Object->BT_J,
  595.         MUIM_Notify, MUIA_Pressed, FALSE,
  596.         Object->App,
  597.         3,
  598.         MUIM_CallHook, &NoteOffHook,58
  599.         );
  600.  
  601.     DoMethod(Object->BT_W,
  602.         MUIM_Notify, MUIA_Pressed, TRUE,
  603.         Object->App,
  604.         3,
  605.         MUIM_CallHook, &NoteOnHook,48
  606.         );
  607.  
  608.     DoMethod(Object->BT_W,
  609.         MUIM_Notify, MUIA_Pressed, FALSE,
  610.         Object->App,
  611.         3,
  612.         MUIM_CallHook, &NoteOffHook,48
  613.         );
  614.  
  615.     DoMethod(Object->BT_X,
  616.         MUIM_Notify, MUIA_Pressed, TRUE,
  617.         Object->App,
  618.         3,
  619.         MUIM_CallHook, &NoteOnHook,50
  620.         );
  621.  
  622.     DoMethod(Object->BT_X,
  623.         MUIM_Notify, MUIA_Pressed, FALSE,
  624.         Object->App,
  625.         3,
  626.         MUIM_CallHook, &NoteOffHook,50
  627.         );
  628.  
  629.     DoMethod(Object->BT_C,
  630.         MUIM_Notify, MUIA_Pressed, TRUE,
  631.         Object->App,
  632.         3,
  633.         MUIM_CallHook, &NoteOnHook,52
  634.         );
  635.  
  636.     DoMethod(Object->BT_C,
  637.         MUIM_Notify, MUIA_Pressed, FALSE,
  638.         Object->App,
  639.         3,
  640.         MUIM_CallHook, &NoteOffHook,52
  641.         );
  642.  
  643.     DoMethod(Object->BT_V,
  644.         MUIM_Notify, MUIA_Pressed, TRUE,
  645.         Object->App,
  646.         3,
  647.         MUIM_CallHook, &NoteOnHook,53
  648.         );
  649.  
  650.     DoMethod(Object->BT_V,
  651.         MUIM_Notify, MUIA_Pressed, FALSE,
  652.         Object->App,
  653.         3,
  654.         MUIM_CallHook, &NoteOffHook,53
  655.         );
  656.  
  657.     DoMethod(Object->BT_B,
  658.         MUIM_Notify, MUIA_Pressed, TRUE,
  659.         Object->App,
  660.         3,
  661.         MUIM_CallHook, &NoteOnHook,55
  662.         );
  663.  
  664.     DoMethod(Object->BT_B,
  665.         MUIM_Notify, MUIA_Pressed, FALSE,
  666.         Object->App,
  667.         3,
  668.         MUIM_CallHook, &NoteOffHook,55
  669.         );
  670.  
  671.     DoMethod(Object->BT_N,
  672.         MUIM_Notify, MUIA_Pressed, TRUE,
  673.         Object->App,
  674.         3,
  675.         MUIM_CallHook, &NoteOnHook,57
  676.         );
  677.  
  678.     DoMethod(Object->BT_N,
  679.         MUIM_Notify, MUIA_Pressed, FALSE,
  680.         Object->App,
  681.         3,
  682.         MUIM_CallHook, &NoteOffHook,57
  683.         );
  684.  
  685.     DoMethod(Object->BT_Virgule,
  686.         MUIM_Notify, MUIA_Pressed, TRUE,
  687.         Object->App,
  688.         3,
  689.         MUIM_CallHook, &NoteOnHook,59
  690.         );
  691.  
  692.     DoMethod(Object->BT_Virgule,
  693.         MUIM_Notify, MUIA_Pressed, FALSE,
  694.         Object->App,
  695.         3,
  696.         MUIM_CallHook, &NoteOffHook,59
  697.         );
  698.  
  699.     DoMethod(Object->BT_PointVirg,
  700.         MUIM_Notify, MUIA_Pressed, TRUE,
  701.         Object->App,
  702.         3,
  703.         MUIM_CallHook, &NoteOnHook,60
  704.         );
  705.  
  706.     DoMethod(Object->BT_PointVirg,
  707.         MUIM_Notify, MUIA_Pressed, FALSE,
  708.         Object->App,
  709.         3,
  710.         MUIM_CallHook, &NoteOffHook,60
  711.         );
  712.  
  713.     DoMethod(Object->SL_velocity,
  714.         MUIM_Notify, MUIA_Slider_Level, MUIV_EveryTime,
  715.         Object->App,
  716.         3,
  717.         MUIM_CallHook, &VelocityChangeHook, Object
  718.         );
  719.  
  720.     DoMethod(Object->SL_MidiChannel,
  721.         MUIM_Notify, MUIA_Slider_Level, MUIV_EveryTime,
  722.         Object->App,
  723.         3,
  724.         MUIM_CallHook, &MidiChannelChangeHook, Object
  725.         );
  726.  
  727.     DoMethod(Object->WI_Principale,
  728.         MUIM_Window_SetCycleChain, Object->BT_2,
  729.         Object->BT_3,
  730.         Object->BT_5,
  731.         Object->BT_6,
  732.         Object->BT_7,
  733.         Object->BT_A,
  734.         Object->BT_Z,
  735.         Object->BT_E,
  736.         Object->BT_R,
  737.         Object->BT_T,
  738.         Object->BT_Y,
  739.         Object->BT_U,
  740.         Object->BT_I,
  741.         Object->BT_S,
  742.         Object->BT_D,
  743.         Object->BT_G,
  744.         Object->BT_H,
  745.         Object->BT_J,
  746.         Object->BT_W,
  747.         Object->BT_X,
  748.         Object->BT_C,
  749.         Object->BT_V,
  750.         Object->BT_B,
  751.         Object->BT_N,
  752.         Object->BT_Virgule,
  753.         Object->BT_PointVirg,
  754.         Object->SL_velocity,
  755.         Object->SL_MidiChannel,
  756.         0
  757.         );
  758.  
  759.     set(Object->WI_Principale,
  760.         MUIA_Window_Open, TRUE
  761.         );
  762.  
  763.  
  764.     return(Object);
  765. }
  766.  
  767.  
  768. void DisposeApp(struct ObjApp * Object)
  769. {
  770.     MUI_DisposeObject(Object->App);
  771.     FreeVec(Object);
  772. }
  773.  
  774. main(void)
  775. {
  776.     BOOL    running = TRUE;
  777.     ULONG    signal;
  778.  
  779.     if (!(MUIMasterBase=OpenLibrary("muimaster.library",0)))
  780.     {
  781.         printf("Can't open muimaster.library...");
  782.         goto fin;
  783.     }
  784.  
  785.     if (!(MidiBase=OpenLibrary(MIDINAME,MIDIVERSION)))
  786.     {
  787.         printf("Can't open midi library...");
  788.         goto fin;
  789.     }
  790.  
  791.     if (!(source = CreateMSource(NULL,NULL)))
  792.     {
  793.         printf("Can't create source\n");
  794.         goto fin;
  795.     }
  796.  
  797.     if (!(RouteOut = MRouteSource(source,"MidiOut",NULL)))
  798.     {
  799.         printf("Can't find MidiOut\n");
  800.         goto fin;
  801.     }
  802.  
  803.  
  804.     App = CreateApp();
  805.  
  806.     while (running)
  807.         {
  808.                 switch (DoMethod(App->App,MUIM_Application_Input,&signal))
  809.                 {
  810.                 case MUIV_Application_ReturnID_Quit:
  811.                         running = FALSE;
  812.                         break;
  813.                 }
  814.     if (running && signal) Wait(signal);
  815.         }
  816.     DisposeApp(App);
  817.  
  818.  
  819. fin:
  820.     if (source) DeleteMSource(source);
  821.     if (RouteOut) DeleteMRoute(RouteOut);
  822.     if (MUIMasterBase) CloseLibrary(MUIMasterBase);
  823.     if (MidiBase) CloseLibrary(MidiBase);
  824.     
  825.     exit(0);        
  826. }
  827.